package com.lwei.tallybook.service.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.lwei.tallybook.base.domain.Account;
import com.lwei.tallybook.base.domain.AccountBook;
import com.lwei.tallybook.base.domain.rel.RelBookAccount;
import com.lwei.tallybook.service.vo.response.BookResponseVO;

import java.util.Date;
import java.util.List;

/**
 * @author sks.lwei
 */
public interface AccountBookService extends IService<AccountBook> {

    /**
     * 保存账本  记账
     * @param accountBook 账本实体
     * @return uuid
     */
    String saveAccountBook(AccountBook accountBook);

    /**
     * 修改账本
     * @param accountBook 账本实体
     */
    void editAccountBook(AccountBook accountBook);

    /**
     * 通过账户id获取账本
     * @param page page
     * @param accountUuid 用户uuid
     * @return list
     */
    IPage<BookResponseVO> listAccountBookByOwner(IPage<AccountBook> page, String accountUuid);

    /**
     * 通过账户id获取账本（用户参与的账本）
     * @param page page
     * @param joinUuid 参与用户uuid
     * @return list
     */
    IPage<BookResponseVO> listAccountBookByJoin(IPage<AccountBook> page, String joinUuid);

    /**
     * 通过账单获取账本
     * @param page page
     * @param billUuid 账单uuid
     * @return list
     */
    IPage<BookResponseVO> listBookByBill(IPage<AccountBook> page, String billUuid);

    /**
     * 通过账单获取账本
     * 筛选参与人
     * @param page page
     * @param billUuid 账单uuid
     * @param join 参与人
     * @return list
     */
    IPage<BookResponseVO> listBookByBillWhitJoin(IPage<AccountBook> page, String billUuid, String join);

    /**
     * 账本清算
     * @param bookUuid uuid
     */
    void killAccountBook(List<String> bookUuid);

    /**
     * 删除账本
     * @param bookUuid uuid
     */
    void removeAccountBook(List<String> bookUuid);

    /**
     * 根据uuid查找账本
     * @param uuid bookuuid
     * @return book
     */
    AccountBook getAccountBookByUuid(String uuid);

    /**
     * 获取账本的关联用户
     * @param bookUuid 账本uuid
     * @return 关联用户
     */
    List<Account> listAccountByBook(String bookUuid);


    /**
     * 获取指定时间段内的 账本记录
     * @param begin begin
     * @param end end
     * @return 记录
     */
    List<AccountBook> listBookBetweenTime(Date begin, Date end);

    /**
     * 列表之前的时间
     *
     * @param end 结束
     * @return {@link List<AccountBook>}
     */
    List<AccountBook> listBookBeforeTime(Date end);

}
